home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
301-325
/
303
/
screenzap
/
screenzap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-14
|
7KB
|
246 lines
/*
* ScreenZap Version 2.3
* by Lars R. Clausen
* Hack this code as you want to, as long as I get the credit for
* ScreenZap
*/
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <exec/ports.h>
#include <exec/memory.h>
void *OpenWindow();
void *GetMsg();
void *OpenLibrary();
void *AllocMem();
struct Window *myw;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
SHORT Pairs1[10][2] =
{{2,2}, {0,4}, {0,19}, {4,23}, {305,23}, {309,19}, {309,4}, {305,0}, {4,0},
{2,2}};
SHORT Pairs2[5][2]={{3,2}, {3,21}, {306,21}, {306,2}, {3,2}};
struct Border GadBord2 =
{ 0,0,3,1,JAM1,10,&Pairs1[0][0],NULL};
struct Border GadBord1 =
{ 0,0,1,2,JAM1,5,&Pairs2[0][0],&GadBord2};
struct IntuiText GadText[4] =
{{3,2,JAM2,38,8,NULL,(UBYTE *)" Kill Screens Behind WorkBench ",NULL},
{3,2,JAM2,38,8,NULL,(UBYTE *)" Kill Screens Except WorkBench ",NULL},
{3,2,JAM2,86,8,NULL,(UBYTE *)" Kill Front Screen ",NULL},
{3,2,JAM2,14,8,NULL,(UBYTE *)" Kill Front Window On Front Screen ",NULL}
};
struct Gadget Gad[4]=
{
{ &Gad[1], 7, 12, 310, 24, GADGHCOMP, RELVERIFY | GADGIMMEDIATE ,
BOOLGADGET, (APTR) &GadBord1, NULL, &GadText[0], NULL, NULL, 0, NULL},
{ &Gad[2], 7, 39, 310, 24, GADGHCOMP, RELVERIFY | GADGIMMEDIATE ,
BOOLGADGET, (APTR) &GadBord1, NULL, &GadText[1], NULL, NULL, 1, NULL},
{ &Gad[3], 323, 12, 310, 24, GADGHCOMP, RELVERIFY | GADGIMMEDIATE ,
BOOLGADGET, (APTR) &GadBord1, NULL, &GadText[2], NULL, NULL, 2, NULL},
{ NULL, 323, 39, 310, 24, GADGHCOMP, RELVERIFY | GADGIMMEDIATE ,
BOOLGADGET, (APTR) &GadBord1, NULL, &GadText[3], NULL, NULL, 3, NULL}
};
struct NewWindow nw =
{
0,10,640,66,0,1,CLOSEWINDOW | GADGETUP,
WINDOWCLOSE | ACTIVATE | WINDOWDEPTH | WINDOWDRAG | SMART_REFRESH | NOCAREREFRESH,
&Gad[0], NULL,(UBYTE *)"Click To Zap Window Or Screen",
NULL, NULL,295,50,295,50,WBENCHSCREEN
};
/* Remove and reply any IntuiMessages hanging off of a port
* which were addressed to a particular window.
* Note that technique does not rely on ln_Succ of a message
* after it has been replied.
*/
void StripIntuiMessages( mp, win )
struct MsgPort *mp;
struct Window *win;
{
struct IntuiMessage *msg;
struct Node *succ;
msg = (struct IntuiMessage *) mp->mp_MsgList.lh_Head;
while( succ = msg->ExecMessage.mn_Node.ln_Succ ) {
if( msg->IDCMPWindow == win ) {
/* Intuition is about to rudely free this message.
* Make sure that we have politely sent it back.
*/
Remove( (struct Node *) msg );
ReplyMsg( (struct Message *) msg );
}
msg = (struct IntuiMessage *) succ;
}
}
void CloseWindowSafely( win )
struct Window *win;
{
/* we forbid here to keep out of race conditions with Intuition */
/* Forbid(); */
/* send back any messages for this window
* that have not yet been processed
*/
StripIntuiMessages( win->UserPort, win );
/* clear UserPort so Intuition will not free it */
win->UserPort = NULL;
/* tell inuition to stop sending more messages */
ModifyIDCMP( win, 0L );
/* turn tasking back on */
/* Permit(); */
/* Inserted by L. Clausen to get out menus; Remove it to get to original
routine */
if (win->MenuStrip!=NULL) ClearMenuStrip(win);
/* and really close the window */
CloseWindow( win );
}
/* bail out! */
abort(nr)
int nr;
{
CloseWindow(myw);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
exit(nr);
}
/* open everything needed */
void OpenIt()
{
IntuitionBase = OpenLibrary("intuition.library",0L);
if (IntuitionBase == 0)
{
exit(1);
}
GfxBase = OpenLibrary("graphics.library",0L);
if (GfxBase == 0)
{
abort(1);
}
myw = OpenWindow(&nw);
if (myw == 0)
{
abort(2);
}
SetWindowTitles(myw,"Click To Zap Window Or Screen","ScreenZapper V2.3 (c) 1989 Lars R. Clausen. This Program is PD.");
}
/* Zap screen - nr 0: All behind workbench, nr 1: All except workbench,
nr 2: Front screen.
This is not multitasking-friendly, but I need the system for myself. */
ScreenZap(nr)
int nr;
{
struct Screen *Curs,*Nexts;
struct Window *Curw;
int x,y=0;
char *Title;
Forbid();
if (nr==0) Curs = myw->WScreen;
else Curs = IntuitionBase->FirstScreen;
if (Curs==myw->WScreen) Curs=Curs->NextScreen;
for (x=0; Curs!=NULL; x++)
{
if (Curs->FirstWindow!=NULL) /* first close all windows */
{
for (Curw=Curs->FirstWindow;Curw->NextWindow!=NULL;Curw=Curs->FirstWindow)
{
for (;Curw->NextWindow!=NULL; Curw=Curw->NextWindow);
CloseWindowSafely(Curw);
y++;
}
CloseWindowSafely(Curw);
y++;
}
Nexts = Curs->NextScreen;
CloseScreen(Curs);
if (Nexts==myw->WScreen) Nexts=Nexts->NextScreen;
Curs = Nexts;
if (nr==2) Curs=NULL;
}
Permit();
if ((x>1) && (y>1)) sprintf(&Title,"%d Screens, %d Windows Zapped.",x,y);
if ((x>1) && (y==1)) sprintf(&Title,"%d Screens, 1 Window Zapped.",x);
if ((x==1) && (y>1)) sprintf(&Title,"1 Screen, %d Windows Zapped.",y);
if ((x==1) && (y==1)) Title="1 Screen & 1 Window Zapped.";
if ((x>1) && (y==0)) sprintf(&Title,"%d Screens Zapped.",x);
if ((x==1) && (y==0)) Title = "1 Screen Zapped.";
if (x==0) Title = "Nothing Zapped";
SetWindowTitles(myw,Title,"ScreenZapper V2.3 (c) 1989 Lars R. Clausen. This Program is PD.");
}
/* To kill the front window */
void WindowZap()
{
struct Screen *Curs;
struct Window *Curw;
struct IntuiMessage *UserMsg;
Forbid();
Curs = IntuitionBase->FirstScreen;
Curw = (struct Window *)Curs->LayerInfo.top_layer->Window;
if (Curw)
{
if (Curw==myw)
{
SetWindowTitles(myw,"That's ME! Use CloseGadget to exit, anything else to continue.",
"ScreenZapper V2.3 (c) 1989 Lars R. Clausen. This Program is PD.");
WaitPort(myw->UserPort);
UserMsg=GetMsg(myw->UserPort);
if (UserMsg->Class==CLOSEWINDOW) abort(0);
else
SetWindowTitles(myw,"Thanks! Maybe the window has gone - try a Screen kill.",
"ScreenZapper V2.3 (c) 1989 Lars R. Clausen. This Program is PD.");
}
else
{
CloseWindowSafely(Curw);
SetWindowTitles(myw,"Window is now zapped, ready again",
"ScreenZapper V2.3 (c) 1989 Lars R. Clausen. This Program is PD.");
}
}
Permit();
}
_main()
{
struct IntuiMessage *msg;
struct Gadget *gad;
int nr;
OpenIt();
WaitPort(myw->UserPort);
for (msg=GetMsg(myw->UserPort);msg->Class == GADGETUP;msg=GetMsg(myw->UserPort))
{
gad=(struct Gadget *)msg->IAddress;
nr=gad->GadgetID;
ReplyMsg(msg);
if (nr<3) ScreenZap(nr);
else WindowZap();
WaitPort(myw->UserPort);
}
ReplyMsg(msg);
abort(0);
}